package com.ruoyi.common.utils;

import com.github.s7connector.api.DaveArea;
import com.github.s7connector.api.S7Connector;
import lombok.extern.slf4j.Slf4j;

import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
@Slf4j
public class S7StrUtils {
    public static byte[] transform(String writeStr, int writeStrLength){
        //        写入字符串
        //第一个参数：DaveArea.DB 表示读取PLC的地址区域为DB
        //第二个参数：DB块地址，若plc中是DB1000，则填1000
        //第三个参数：偏移量
        //第四个参数：写入的数据 二进制数组byte[]  ,总长度为10的话，有效数据只能是10-8，第一位代表总长，第二位，代表有效数据字节
        byte[] writeBytes = new byte[writeStrLength];
        writeBytes[0] = (byte) writeStrLength;//写入本字符串块总宽度
        writeStr = writeStr.trim();//清除掉两边的空串
        int availableEffectCharLength = 0;//有效字符数控制
        if (writeStr.length() > writeStrLength - 2) {//>writeStrLength-2 截断到最大有效数据位
            availableEffectCharLength = writeStrLength - 2;

        } else {//<=writeStrLength-2
            availableEffectCharLength = writeStr.length();
        }
        writeBytes[1] = (byte) availableEffectCharLength;//写入有效字节数
        byte[] strBytes = writeStr.getBytes(StandardCharsets.US_ASCII);
        for (int i = 0; i < availableEffectCharLength; i++) {
            writeBytes[i + 2] = strBytes[i];
        }
        return writeBytes;
    }

    /**
     * 获取对应类型的byte[]数组
     * type:
     *  1-int
     *  2-Dint
     *  3-LReal
     *  4-Real
     */
    public static byte[] getByte(int value1,double value2,int type){
        byte[] bytes = new byte[0];
        if ( type == 1 ){
            bytes = ByteBuffer.allocate(2).putShort((short)value1).array();
        }
        if ( type == 2 ){
            bytes = ByteBuffer.allocate(4).putInt(value1).array();
        }
        if ( type == 3 ){
            bytes = ByteBuffer.allocate(4).putFloat((float) value2).array();
        }
        if ( type == 4 ){
            bytes = ByteBuffer.allocate(8).putDouble(value2).array();
        }
        return bytes;
    }


    /**
     * 写入值
     * dbNum--DB编码，offset--偏移量，value--写入的值,length--写入值占用的字节长度
     * type：
     *  int(java--Integer类型):1
     *  Dint(java--Long类型):2
     *  Real(java--Double):3
     *  LReal(java--长浮点数，没有对应的类型):4
     */
    public static void writeValue(S7Connector s7Connector, int dbNum, int offset, int value, int type){
        //将参数转换成对应格式的byte数组
        byte[] bytes = getByte(value,0,type);
        //写入PLC
        //第一个参数：DaveArea.DB 表示读取PLC的地址区域为DB
        //第二个参数：DB块地址，若plc中是DB1000，则填1000
        //第三个参数：偏移量
        //第四个参数：写入的数据 二进制数组byte[]
        s7Connector.write(DaveArea.DB,dbNum, offset,bytes);
        log.info("写入参数成功，offset--{}，value--{}",offset,value);
    }
}
